package cn.com.yang.serializable;

import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtobufIOUtil;
import com.dyuproject.protostuff.runtime.RuntimeSchema;

/**
 * jdk版本和jar版本的兼容问题，并且需要序列化的实体并不需要实现Serializable 接口
 * Google 序列化 Netty默认提供了支持
 * @Author 杨亿金
 * @Date 2021/12/29 22:15
 * @CopyRight
 * @Version
 */
public class TestProtoBuff {

    /**
     * 序列化方法
     * @param t
     * @param tClass
     * @param <T>
     * @return
     */
    public static <T> byte[] enSerialize(T t,Class<T> tClass){
        return ProtobufIOUtil.toByteArray(t, RuntimeSchema.createFrom(tClass),
                LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
    }

    /**
     * 反序列化
     * 第一个<T>是与传入的参数Class<T>相对应的，相当于返回值的一个泛型
     * 后面的T是返回值类型，代表方法必须返回T类型的（由传入的Class<T>决定）
     * @param bytes
     * @param clzz
     * @param <T>
     * @return
     */
    public static <T> T deSerialize(byte[] bytes,Class<T> clzz){
        RuntimeSchema<T> runtimeSchema =RuntimeSchema.createFrom(clzz);
        T t = runtimeSchema.newMessage();
        ProtobufIOUtil.mergeFrom(bytes,t,runtimeSchema);
        return t;
    }
}
